home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / demovers / scripter / demo / plotter.sic < prev    next >
Text File  |  1998-09-26  |  2KB  |  119 lines

  1. //ACE-SICPAR 8 0043 
  2. /*
  3.  * Ein kleiner ASCII-Funktionsplotter    (c) 17.7.97 Christian Wempe
  4.  */
  5. uses "math.lib";
  6. uses "io.lib";
  7.  
  8. const SCREEN_WIDTH = 72;
  9. const SCREEN_HEIGHT = 20;
  10.  
  11. /*
  12.  * Hauptfunktion
  13.  */
  14. proc main(...)
  15. local i;
  16. {
  17.     printf("Zeichnet eine Funktion im Bereich -5 bis 5\n");
  18.  
  19.     /*
  20.      * Eingeben der Funktion
  21.      */
  22.     func = "";
  23.     printf("Funktion f(x) eingeben: ");
  24.     input(func);
  25.     translate(f, "", "return " + func + ";");
  26.  
  27.     /*
  28.      * Das Array initialisieren (erzeugen)
  29.      */
  30.     screen.length = SCREEN_WIDTH;
  31.     for (i = 0; i < SCREEN_WIDTH; ++i)
  32.         screen[i].length = SCREEN_HEIGHT;
  33.  
  34.     printf("\nFunktion: %s\nBitte warten...\n", func);
  35.     precision(10);
  36.  
  37.     /*
  38.      * Hier wird geplottet. Parameter: Xmin, Xmax, Ymin [, Yscale]
  39.      * Soll ein anderer Bereich gezeichnet werden, oder die Funktion in
  40.      * Y-Richtung gedehnt oder gestaucht werden, müssen die Parameter hier
  41.      * geändert werden.
  42.      */
  43.     plot(-5.0, 5.0, -1.0);
  44. }
  45.  
  46.  
  47. /*
  48.  * Einen Punkt im Screen-Array setzen
  49.  */
  50. proc plotXY(x, y)
  51. local ix, iy, pix;
  52. {
  53.     x -= x_offset;
  54.     y -= y_offset;
  55.  
  56.     ix = int(round(x / width));
  57.     iy = int(round((y / width) * y_scale));
  58.  
  59.     pix = '*';
  60.     if (iy < 0) iy = 0, pix = 'v';                                  // Funktionswert zu klein
  61.     if (iy > (SCREEN_HEIGHT-1)) iy = (SCREEN_HEIGHT-1), pix = '^';  // Funktionswert zu gross
  62.     screen[ix, iy] = pix;
  63. }
  64.  
  65.  
  66. /*
  67.  * Eine Funktion ins Array zeichnen und dann ausgeben
  68.  */
  69. proc plot(start, end, y_off, y_s = 1.0)
  70. local i, j, line, x, y;
  71. {
  72.     /*
  73.      * Zwei Sicherheitstests: Startwert sollte kleiner als Endwert sein
  74.      * und y nicht mit 0 skaliert werden.
  75.      */
  76.     if (start >= end) throw("bad range", start, end);
  77.     if (y_s == 0) throw("bad scale", y_s);
  78.  
  79.     /*
  80.      * Das Array mit Blanks initialisieren.
  81.      */
  82.     for (i = 0; i < SCREEN_WIDTH; ++i)
  83.         for (j = 0; j < SCREEN_HEIGHT; ++j) screen[i, j] = ' ';
  84.  
  85.     /*
  86.      * Variablen, die zum Zeichnen benoetigt werden, initialisieren.
  87.      */
  88.     width = (end - start) / (SCREEN_WIDTH - 1);
  89.     x_offset = start;
  90.     y_offset = y_off;
  91.     y_scale = y_s;
  92.  
  93.     /*
  94.      * Werte von <start> bis <end> berechnen und plotten
  95.      */
  96.     for (x = start; x < end; x += width) {
  97.         y = f(x);
  98.         plotXY(x, y);
  99.     }
  100.  
  101.     /*
  102.      * Fuer jede Zeile einen String basteln und dann ausgeben.
  103.      */
  104.     for (j = SCREEN_HEIGHT - 1; j >= 0; --j) {
  105.         line = "";
  106.         for (i = 0; i < SCREEN_WIDTH; ++i) line[i] = screen[i, j];
  107.         print(line);
  108.     }
  109. }
  110.  
  111.  
  112. /*
  113.  * In diese Funktion wird der Ausdruck uebersetzt
  114.  */
  115. proc f(x)
  116. {
  117.     return x;
  118. }
  119.